package com.example.juc.big_talk_concurrent.chapter1.article4;

public class Client1 {
    static int i = 0;
    static int j;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            i = 1;
            System.out.println("i = " + i);
        }, "t1");

        Thread t2 = new Thread(() -> {
            j = i;
            System.out.println("j = " + j);
        }, "t2");

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println(i);
        System.out.println(j);
    }
}

// 当线程 1 执行 i = 1 这句时，会先去主内存中读取 i 的初始值，然后加载到线程 1 的的工作内存中，再赋值为1，至此，线程 1 的工作内存当中 i 的值变为 1 了，不过还没有写入到主内存当中。
//
// 如果在线程 1 准备把新的 i 值写回主内存的时候，线程 2 执行了 j = i 这条语句，它会去主存读取 i 的值并加载到线程 2 的工作内存当中，而此时主内存当中 i 的值还是 0，那么就会使得 j 的值为 0，而不是 1。
//
// 这就是内存可见性问题，线程 1 修改了共享变量 i 的值，线程 2 并没有立即得知这个修改。
// j = 0
// i = 1
// 1
// 0
